Internet-based distributed application systems require data storage systems that are more complex than those of non-distributed systems. Desirable properties of such storage systems include scalability (the ability to increase aggregate storage capacity by adding new storage units without system redesigns), data replication (multiple distributed copies of the same data, in order to prevent data loss upon failure of a particular storage system unit), write availability (applications not being prevented from writing to the storage due to hardware failures or to competition writes from other applications), fast update/query times, and simplicity of use for applications using the data storage.
It is difficult for distributed storage systems to simultaneously achieve all of these objectives. As one example, the increasing complexity of the data storage infrastructure and algorithms needed to achieve properties such as scalability, data replication, write availability, and fast read/query times tend to render use of the data storage more difficult for application code, which may need to be aware of complexities such as handling different types of error conditions.